package com.ktjy.ktmall.service.impl;

import com.ktjy.ktmall.dao.*;
import com.ktjy.ktmall.dao.impl.*;
import com.ktjy.ktmall.entity.*;
import com.ktjy.ktmall.service.CartItemService;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 购物车模块Service接口实现类
 * @version v1.0
 * @Author 郴州科泰
 * @Create 2024-08-02 - 14:45
 */
public class CartItemServiceImpl implements CartItemService {
    CartItemDao dao = new CartItemDaoImpl();

    // 加入购物车
    @Override
    public int insert(CartItem cartItem) {
        CartItem cart = dao.findByUserIdAndSkuId(cartItem.getUserId(), cartItem.getSkuId());
        // 购物车不为空，表示当前商品sku已经被此用户添加到购物车中。
        if (cart != null) {
            // 不为null表示，当前商品sku已经被添加到购物车中了，此时对此商品的购买数量进行累加
            return dao.updateBuyNum(cartItem.getUserId(), cartItem.getSkuId(), cartItem.getGoodsCount());
        }
        // 如果购物车没有加入当前商品，那就把此商品添加到购物车中，即t_cart表中
        return dao.insert(cartItem);
    }

    SkuItemDao skuDao = new SkuItemDaoImpl();
    GoodsItemDao goodsDao = new GoodsItemDaoImpl();
    WxUserDao userDao = new WxUserDaoImpl();
    AttrItemDao attrDao = new AttrItemDaoImpl();
    AttrValuesDao avDao = new AttrValuesDaoImpl();

    /**
     * 查询当前登录用户购物车中的商品列表
     * @param userId 当前登录的微信用户id
     */
    @Override
    public List<CartItem> findByUserId(int userId) {
        List<CartItem> list = dao.findByUserId(userId);
        List<CartItem> cartGoodsList = list.stream().map((cart) -> {
            // 1、查询购物车的详情信息
            CartItem c = dao.findById(cart.getId());
            if (c == null) return c;
            // 2、通过购物车中的skuId查询商品SKU的信息
            SkuItem sku = skuDao.findById(c.getSkuId());
            // 2.1 查询SKU的属性值列表
            List<AttrValues> skuAttrVals = avDao.getSkuAttrVals(sku.getStockSku());
            // 6.3 查询每个SKU的属性列表
            List<AttrItem> attrs = attrDao.findAttrByStockSku(sku.getStockSku());
            // 6.4 遍历SKU的规格属性列表，查询出每个属性下的属性值列表
            attrs = attrs.stream().map(attr -> {
                // 6.5查询出当前属性下的属性值列表
                List<AttrValues> aVs = skuAttrVals.stream().filter(attrV -> {
                    return attrV.getAttrId() == attr.getId(); // 过滤条件：属性值对象的属性id == 属性对象的id
                }).collect(Collectors.toList());
                attr.setValues(aVs);  // 将过滤出来的属性值列表aVs赋值给attr属性对象的values
                return attr;
            }).collect(Collectors.toList());
            sku.setSpecs(attrs); // 将属性列表attrs赋值给skuitem对象的specs集合。此时的attrs中包含属性值列表

            // 3、查询此SKU所关联的商品
            GoodsItem goods = goodsDao.findById(sku.getGoodsId());
            sku.setGoods(goods); // 赋值goods商品对象给SkuItem
            c.setSkuItem(sku); // 将赋值物对象赋值给购物车对象。
            // 4、查询微信用户对象
            WxUser wxUser = userDao.findById(c.getUserId());
            c.setWxUser(wxUser);
            return c;
        }).collect(Collectors.toList());
        return cartGoodsList;
    }

    @Override
    public int updateSelected(int id, int selected) {
        return dao.updateSelected(id, selected);
    }

    @Override
    public int updateAllSelect(int userId, int selected) {
        return dao.updateAllSelect(userId, selected);
    }

    @Override
    public List<CartItem> findSelectedByUserId(int userId) {
        List<CartItem> list = dao.findSelectedByUserId(userId);
        List<CartItem> cartGoodsList = list.stream().map((cart) -> {
            // 1、查询购物车的详情信息
            CartItem c = dao.findById(cart.getId());
            if (c == null) return c;
            // 2、通过购物车中的skuId查询商品SKU的信息
            SkuItem sku = skuDao.findById(c.getSkuId());
            // 2.1 查询SKU的属性值列表
            List<AttrValues> skuAttrVals = avDao.getSkuAttrVals(sku.getStockSku());
            // 6.3 查询每个SKU的属性列表
            List<AttrItem> attrs = attrDao.findAttrByStockSku(sku.getStockSku());
            // 6.4 遍历SKU的规格属性列表，查询出每个属性下的属性值列表
            attrs = attrs.stream().map(attr -> {
                // 6.5查询出当前属性下的属性值列表
                List<AttrValues> aVs = skuAttrVals.stream().filter(attrV -> {
                    return attrV.getAttrId() == attr.getId(); // 过滤条件：属性值对象的属性id == 属性对象的id
                }).collect(Collectors.toList());
                attr.setValues(aVs);  // 将过滤出来的属性值列表aVs赋值给attr属性对象的values
                return attr;
            }).collect(Collectors.toList());
            sku.setSpecs(attrs); // 将属性列表attrs赋值给skuitem对象的specs集合。此时的attrs中包含属性值列表

            // 3、查询此SKU所关联的商品
            GoodsItem goods = goodsDao.findById(sku.getGoodsId());
            sku.setGoods(goods); // 赋值goods商品对象给SkuItem
            c.setSkuItem(sku); // 将赋值物对象赋值给购物车对象。
            // 4、查询微信用户对象
            WxUser wxUser = userDao.findById(c.getUserId());
            c.setWxUser(wxUser);
            return c;
        }).collect(Collectors.toList());
        return cartGoodsList;
    }

    // 通过购物车id查询购物车的详情信息，包括(商品信息、商品的SKU信息以及微信用户信息)
    @Override
    public CartItem findById(int id) {
        // 1、查询购物车的详情信息
        CartItem c = dao.findById(id);
        // 2、通过购物车中的skuId查询商品SKU的信息
        SkuItem sku = skuDao.findById(c.getSkuId());
        // 3、查询此SKU所关联的商品
        GoodsItem goods = goodsDao.findById(sku.getGoodsId());
        sku.setGoods(goods); // 赋值goods商品对象给SkuItem
        c.setSkuItem(sku); // 将赋值物对象赋值给购物车对象。
        // 4、查询微信用户对象
        WxUser wxUser = userDao.findById(c.getUserId());
        c.setWxUser(wxUser);
        // 如此购物车对象中又有商品SKU信息又有商品信息，还有微信用户信息
        return c;
    }

    @Override
    public int update(int id, int goodsCount) {
        return dao.update(id, goodsCount);
    }

    @Override
    public int batchDel(String ids) {
        return dao.batchDel(ids);
    }


}
